// 全局工具
export default {
	install(Vue) {
		// 网址
		Vue.prototype.$_Url = () => {
			return "https://www.xxx.co"
		},
		// 配置文件访问网址
		Vue.prototype.$_Config = () => {
			return "https://www.xxx.co/appConfig/"
		},
		// 网站密钥
		Vue.prototype.$_FresnsConfig = () => {
			return {
				"AppID": "AppID",
				"AppSecret": "AppSecret",
				"Platform": 4,
				"ContentFormat": "html"
			}
		},
		// 自定义锚点
		Vue.prototype.$_anchorPoint = () => {
			return {
				"u":"/u/", // ------------- 用户详情页 -> 对应后台 -> 用户主页
				"hashtag":"/hashtag/", // - 话题列表页 -> 对应后台 -> 话题详情
				"post":"/post/", // ------- 帖子详情页 -> 对应后台 -> 帖子详情
				"group":"/group/" // ------ 小组列表页 -> 对应后台 -> 小组详情
			}
		},
		// 公用 header
		Vue.prototype.$_FresnsHeader = () => {
			let AppID = Vue.prototype.$_FresnsConfig().AppID,
				AppSecret = Vue.prototype.$_FresnsConfig().AppSecret,
				Platform = Vue.prototype.$_FresnsConfig().Platform,
				Version = '1.0.0',
				DeviceInfo = '{"networkIpv4": "127.0.0.1"}',
				ContentFormat = Vue.prototype.$_FresnsConfig().ContentFormat;

			const now = new Date(); // 获取设备本地时间
			const timezoneOffsetInHours = now.getTimezoneOffset() / -60; // 获取时区偏移的小时数
			const utcTimezone = (timezoneOffsetInHours > 0 ? '+' : '') + timezoneOffsetInHours.toString(); // 获取 UTC 时区
			
			const utc8Timestamp = Date.now(); // UTC+8 时区的时间戳（微信固定为东八区时间）
			const Timestamp = utc8Timestamp - 8 * 60 * 60 * 1000; // 获取 UTC+0 时区的 Unix 时间戳

			// 未登录
			if(!uni.getStorageSync('account') && !uni.getStorageSync('user')){
				let Signature = Vue.prototype.$_MD5(`X-Fresns-App-Id=${AppID}&X-Fresns-Client-Platform-Id=${Platform}&X-Fresns-Client-Version=${Version}&X-Fresns-Signature-Timestamp=${Timestamp}&AppSecret=${AppSecret}`,32);
				let Header =  {
					"X-Fresns-App-Id":AppID,
					"X-Fresns-Client-Content-Format":ContentFormat,
					"X-Fresns-Client-Platform-Id":Platform,
					"X-Fresns-Client-Version":Version,
					"X-Fresns-Client-Device-Info":DeviceInfo,
					'X-Fresns-Client-Timezone': utcTimezone,
					"X-Fresns-Signature-Timestamp":Timestamp,
					"X-Fresns-Signature":Signature
				}

				if (!uni.getStorageSync('deviceInfo') || JSON.stringify(uni.getStorageSync('deviceInfo')).length < 2){
					Vue.prototype.$_getIpInfo(Header);
				}

				return Header
			}


			DeviceInfo = uni.getStorageSync('deviceInfo') ? JSON.stringify(uni.getStorageSync('deviceInfo')) : DeviceInfo

			// 已登录账号
			if(uni.getStorageSync('account') && !uni.getStorageSync('user')){
				let aid = uni.getStorageSync('account').data.detail.aid,
					aidtoken = uni.getStorageSync('account').data.sessionToken.token;
				let Signature = Vue.prototype.$_MD5(`X-Fresns-Aid=${aid}&X-Fresns-Aid-Token=${aidtoken}&X-Fresns-App-Id=${AppID}&X-Fresns-Client-Platform-Id=${Platform}&X-Fresns-Client-Version=${Version}&X-Fresns-Signature-Timestamp=${Timestamp}&AppSecret=${AppSecret}`,32);
				return {
					"X-Fresns-App-Id":AppID,
					"X-Fresns-Client-Content-Format":ContentFormat,
					"X-Fresns-Client-Platform-Id":Platform,
					"X-Fresns-Client-Version":Version,
					"X-Fresns-Client-Device-Info":DeviceInfo,
					'X-Fresns-Client-Timezone': utcTimezone,
					"X-Fresns-Signature-Timestamp":Timestamp,
					"X-Fresns-Signature":Signature,
					"X-Fresns-Aid":aid,
					"X-Fresns-Aid-Token":aidtoken
				}
			}
			// 已登录账号 && 已登录用户
			if(uni.getStorageSync('account') && uni.getStorageSync('user')){
				let aid = uni.getStorageSync('account').data.detail.aid,
					aidtoken = uni.getStorageSync('account').data.sessionToken.token,
					uid = uni.getStorageSync('user').data.detail.uid,
					uidtoken = uni.getStorageSync('user').data.sessionToken.token;
				let Signature = Vue.prototype.$_MD5(`X-Fresns-Aid=${aid}&X-Fresns-Aid-Token=${aidtoken}&X-Fresns-App-Id=${AppID}&X-Fresns-Client-Platform-Id=${Platform}&X-Fresns-Client-Version=${Version}&X-Fresns-Signature-Timestamp=${Timestamp}&X-Fresns-Uid=${uid}&X-Fresns-Uid-Token=${uidtoken}&AppSecret=${AppSecret}`,32);
				return {
					"X-Fresns-App-Id":AppID,
					"X-Fresns-Client-Content-Format":ContentFormat,
					"X-Fresns-Client-Platform-Id":Platform,
					"X-Fresns-Client-Version":Version,
					"X-Fresns-Client-Device-Info":DeviceInfo,
					'X-Fresns-Client-Timezone': utcTimezone,
					"X-Fresns-Signature-Timestamp":Timestamp,
					"X-Fresns-Signature":Signature,
					"X-Fresns-Aid":aid,
					"X-Fresns-Aid-Token":aidtoken,
					"X-Fresns-Uid":uid,
					"X-Fresns-Uid-Token":uidtoken
				}
			}
		},
		// 网络请求
		Vue.prototype.$_Request = (method,url,data={},success) => {
			uni.request({
				url:Vue.prototype.$_Url() + url,
				method:method,
				header:Vue.prototype.$_FresnsHeader(),
				data: {
					...data
				},
				success: (res) => {
					success(res)
				}
			})
		},
		// 获取header info信息
		Vue.prototype.$_getIpInfo = (Header) => {
			const systemInfo = uni.getSystemInfoSync();
			const networkInfo = uni.getNetworkType();
			const systemLang = systemInfo.language || 'zh_CN';
		
			uni.request({
				url:Vue.prototype.$_Url() + "/api/v2/common/ip-info",
				method:'GET',
				header:Header,
				success: (res) => {
					if (res.data.code === 0) {
						const ipInfo = res.data.data;
		
						const deviceInfo = {
							agent: 'WeChat',
							type: 'Mobile', // Desktop, Mobile, Tablet, Bot
							mac: null,
							brand: systemInfo.brand,
							model: systemInfo.model,
							platformName: systemInfo.system,
							platformVersion: null,
							browserName: systemInfo.platform,
							browserVersion: systemInfo.version,
							browserEngine: systemInfo.host ? systemInfo.host.env : null,
							appImei: null,
							appAndroidId: null,
							appOaid: null,
							appIdfa: null,
							simImsi: null,
							networkType: networkInfo.networkType,
							networkIpv4: ipInfo.networkIpv4,
							networkIpv6: ipInfo.networkIpv6,
							networkPort: ipInfo.networkPort,
							networkTimezone: ipInfo.networkTimezone,
							networkOffset: ipInfo.networkOffset,
							networkIsp: ipInfo.networkIsp,
							networkOrg: ipInfo.networkOrg,
							networkAs: ipInfo.networkAs,
							networkAsName: ipInfo.networkAsName,
							networkMobile: ipInfo.networkMobile,
							networkProxy: ipInfo.networkProxy,
							networkHosting: ipInfo.networkHosting,
							mapId: ipInfo.mapId,
							latitude: ipInfo.latitude,
							longitude: ipInfo.longitude,
							scale: ipInfo.scale,
							continent: ipInfo.continent,
							continentCode: ipInfo.continentCode,
							country: ipInfo.country,
							countryCode: ipInfo.countryCode,
							region: ipInfo.region,
							regionCode: ipInfo.regionCode,
							city: ipInfo.city,
							cityCode: ipInfo.cityCode,
							district: ipInfo.district,
							address: ipInfo.address,
							zip: ipInfo.zip,
						};
		
						// device info
						uni.setStorageSync('deviceInfo', deviceInfo);
					}
				}
			})
		},
		// 路由跳转
		Vue.prototype.$_To = (URL,Token) => {
			if(Token){
				if(uni.getStorageSync('account') && uni.getStorageSync('user')){
					uni.navigateTo({
						url: "/pages/" + URL
					});
				}else{
					uni.showToast({
						title:"未登录，请先登陆",
						icon:"none",
						duration:1000
					});
				}
			}else{
				uni.navigateTo({
					url: "/pages/" + URL
				});
			}
		},
		// 内容监听替换
		Vue.prototype.$_contentObservers = (html) => {
			let u = Vue.prototype.$_anchorPoint().u;
			let hashtag = Vue.prototype.$_anchorPoint().hashtag;

			let post = Vue.prototype.$_anchorPoint().post;
			let group = Vue.prototype.$_anchorPoint().group;


			let Url_u = Vue.prototype.$_Url()+Vue.prototype.$_anchorPoint().u;
			let Url_hashtag = Vue.prototype.$_Url()+Vue.prototype.$_anchorPoint().hashtag;

			let Url_post = Vue.prototype.$_Url()+Vue.prototype.$_anchorPoint().post;
			let Url_group = Vue.prototype.$_Url()+Vue.prototype.$_anchorPoint().group;

			let a1 = html.replace(new RegExp(Url_u, 'g'), '/pages/user/user?uid=');
			let a2 = a1.replace(new RegExp(Url_hashtag, 'g'), '/pages/hashtag/hashtag?hid=');

			let a3 = a2.replace(new RegExp(Url_post, 'g'), '/pages/post/post?pid=');
			let a4 = a3.replace(new RegExp(Url_group, 'g'), '/pages/group/group?gid=');
			
			// 增加表情图样式
			a4 = a4.replace(
			  /<img\s+src="([^"]+)"\s+class="fresns_sticker"\s+alt="([\s\S]*?)"\s*\/?>/gi,
			  '<img src="$1" style="display: inline-block;max-width: 50rpx;max-height: 50rpx;vertical-align: top;margin:0 10rpx;" alt="$2"/>'
			);
			
			// 将单个换行符转换为两个换行符
			a4 = a4.replace(/\n/g, '\n\n');
			// 将连续的两个或多个换行符恢复为一个换行符
			a4 = a4.replace(/\n\n+/g, '\n\n');
			
			return a4
		},
		// 过滤HTML
		Vue.prototype.$_filterHtml = (html) => {
			let str = html;
			str = str.replace(/<.*?>/g,"");
			const filteredText = str.replace(/\[file:[^\]]+\]/g, "");
			return filteredText
		},
		// 图片预览
		Vue.prototype.$_picturePreview = (index,item) => {
			let img=[];
			for (let i = 0; i < item.length; i++) { img.push(item[i].imageBigUrl) }
			uni.previewImage({
				current:index,
				urls:img
			})
		},
		// 是否登录
		Vue.prototype.$_loginOrNot = () => {
			if(uni.getStorageSync('account') && uni.getStorageSync('user')){
				return true
			}else{
				return false
			}
		},
		// 删除指定pid
		Vue.prototype.$_removeItems = (list, ids) => {
			return list.filter(item => {
				const { groups } = item
				if (Array.isArray(item.groups)) {
					item.groups = Vue.prototype.$_removeItems(groups, ids)
				}
				return !ids.includes(item.gid)
			})
		},
		// 未登录提示
		Vue.prototype.$_notLoggedInPrompt = () => {
			uni.showToast({
				title:"未登录",
				icon:"none",
				duration:1000,
			});
			setTimeout(()=>{
				uni.switchTab({
					url:"/pages/my/my"
				})
			},1000);
		},
		// 是否有消息
		Vue.prototype.$_isThereAnotification = () => {
			uni.request({
				url:Vue.prototype.$_Url() + "/api/v2/user/panel",
				method:"GET",
				header:Vue.prototype.$_FresnsHeader(),
				success: (res) => {
					if(uni.getStorageSync('account') && uni.getStorageSync('user')){
						let aiTe = res.data.data.unreadNotifications.mentions,
							comment = res.data.data.unreadNotifications.comments,
							dialogue = res.data.data.conversations.unreadMessages;
						if(aiTe || comment || dialogue){
							uni.showTabBarRedDot({
								index: 3
							})
						}else{
							uni.hideTabBarRedDot({
								index: 3
							})
						}
					}
					
				}
			})
		},
		// 字符串转Base64
		Vue.prototype.$_stringToBase64 = (str) => {
			let c1, c2, c3;
			let base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
			let i = 0, len = str.length, string = '';
			
			while (i < len) {
				c1 = str.charCodeAt(i++) & 0xff;
				if (i == len) {
					string += base64EncodeChars.charAt(c1 >> 2);
					string += base64EncodeChars.charAt((c1 & 0x3) << 4);
					string += "==";
					break;
				}
				c2 = str.charCodeAt(i++);
				if (i == len) {
					string += base64EncodeChars.charAt(c1 >> 2);
					string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
					string += base64EncodeChars.charAt((c2 & 0xF) << 2);
					string += "=";
					break;
				}
				c3 = str.charCodeAt(i++);
				string += base64EncodeChars.charAt(c1 >> 2);
				string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
				string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
				string += base64EncodeChars.charAt(c3 & 0x3F)
			}
			return string
		},
		// MD5 加密
		Vue.prototype.$_MD5 = (string, bit) => {
			function md5_RotateLeft(lValue, iShiftBits) {
				return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
			}
			function md5_AddUnsigned(lX, lY) {
				let lX4, lY4, lX8, lY8, lResult;
				lX8 = (lX & 0x80000000);
				lY8 = (lY & 0x80000000);
				lX4 = (lX & 0x40000000);
				lY4 = (lY & 0x40000000);
				lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
				if (lX4 & lY4) {
					return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
				}
				if (lX4 | lY4) {
					if (lResult & 0x40000000) {
						return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
					} else {
						return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
					}
				} else {
					return (lResult ^ lX8 ^ lY8);
				}
			}
			function md5_F(x, y, z) {
				return (x & y) | ((~x) & z);
			}
			function md5_G(x, y, z) {
				return (x & z) | (y & (~z));
			}
			function md5_H(x, y, z) {
				return (x ^ y ^ z);
			}
			function md5_I(x, y, z) {
				return (y ^ (x | (~z)));
			}
			function md5_FF(a, b, c, d, x, s, ac) {
				a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_F(b, c, d), x), ac));
				return md5_AddUnsigned(md5_RotateLeft(a, s), b);
			};
			function md5_GG(a, b, c, d, x, s, ac) {
				a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_G(b, c, d), x), ac));
				return md5_AddUnsigned(md5_RotateLeft(a, s), b);
			};
			function md5_HH(a, b, c, d, x, s, ac) {
				a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_H(b, c, d), x), ac));
				return md5_AddUnsigned(md5_RotateLeft(a, s), b);
			};
			function md5_II(a, b, c, d, x, s, ac) {
				a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_I(b, c, d), x), ac));
				return md5_AddUnsigned(md5_RotateLeft(a, s), b);
			};
			function md5_ConvertToWordArray(string) {
				let lWordCount;
				let lMessageLength = string.length;
				let lNumberOfWords_temp1 = lMessageLength + 8;
				let lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
				let lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
				let lWordArray = Array(lNumberOfWords - 1);
				let lBytePosition = 0;
				let lByteCount = 0;
				while (lByteCount < lMessageLength) {
					lWordCount = (lByteCount - (lByteCount % 4)) / 4;
					lBytePosition = (lByteCount % 4) * 8;
					lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) <<
						lBytePosition));
				lByteCount++;
				}
				lWordCount = (lByteCount - (lByteCount % 4)) / 4;
				lBytePosition = (lByteCount % 4) * 8;
				lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
				lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
				lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
				return lWordArray;
			};
			function md5_WordToHex(lValue) {
				let WordToHexValue = "",
					WordToHexValue_temp = "",
					lByte, lCount;
				for (lCount = 0; lCount <= 3; lCount++) {
					lByte = (lValue >>> (lCount * 8)) & 255;
					WordToHexValue_temp = "0" + lByte.toString(16);
					WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);
				}
				return WordToHexValue;
			};
			function md5_Utf8Encode(string) {
				string = string.replace(/\r\n/g, "\n");
				let utftext = "";
				for (let n = 0; n < string.length; n++) {
					let c = string.charCodeAt(n);
					if (c < 128) {
						utftext += String.fromCharCode(c);
					} else if ((c > 127) && (c < 2048)) {
						utftext += String.fromCharCode((c >> 6) | 192);
						utftext += String.fromCharCode((c & 63) | 128);
					} else {
						utftext += String.fromCharCode((c >> 12) | 224);
						utftext += String.fromCharCode(((c >> 6) & 63) | 128);
						utftext += String.fromCharCode((c & 63) | 128);
					}
				}
				return utftext;
			};
			let x = Array();
			let k, AA, BB, CC, DD, a, b, c, d;
			let S11 = 7,
				S12 = 12,
				S13 = 17,
				S14 = 22;
			let S21 = 5,
				S22 = 9,
				S23 = 14,
				S24 = 20;
			let S31 = 4,
				S32 = 11,
				S33 = 16,
				S34 = 23;
			let S41 = 6,
				S42 = 10,
				S43 = 15,
				S44 = 21;
			string = md5_Utf8Encode(string);
			x = md5_ConvertToWordArray(string);
			a = 0x67452301;
			b = 0xEFCDAB89;
			c = 0x98BADCFE;
			d = 0x10325476;
			for (k = 0; k < x.length; k += 16) {
				AA = a;
				BB = b;
				CC = c;
				DD = d;
				a = md5_FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
				d = md5_FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
				c = md5_FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
				b = md5_FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
				a = md5_FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
				d = md5_FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
				c = md5_FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
				b = md5_FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
				a = md5_FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
				d = md5_FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
				c = md5_FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
				b = md5_FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
				a = md5_FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
				d = md5_FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
				c = md5_FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
				b = md5_FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
				a = md5_GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
				d = md5_GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
				c = md5_GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
				b = md5_GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
				a = md5_GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
				d = md5_GG(d, a, b, c, x[k + 10], S22, 0x2441453);
				c = md5_GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
				b = md5_GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
				a = md5_GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
				d = md5_GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
				c = md5_GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
				b = md5_GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
				a = md5_GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
				d = md5_GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
				c = md5_GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
				b = md5_GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
				a = md5_HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
				d = md5_HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
				c = md5_HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
				b = md5_HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
				a = md5_HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
				d = md5_HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
				c = md5_HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
				b = md5_HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
				a = md5_HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
				d = md5_HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
				c = md5_HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
				b = md5_HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
				a = md5_HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
				d = md5_HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
				c = md5_HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
				b = md5_HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
				a = md5_II(a, b, c, d, x[k + 0], S41, 0xF4292244);
				d = md5_II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
				c = md5_II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
				b = md5_II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
				a = md5_II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
				d = md5_II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
				c = md5_II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
				b = md5_II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
				a = md5_II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
				d = md5_II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
				c = md5_II(c, d, a, b, x[k + 6], S43, 0xA3014314);
				b = md5_II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
				a = md5_II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
				d = md5_II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
			c = md5_II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
				b = md5_II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
				a = md5_AddUnsigned(a, AA);
				b = md5_AddUnsigned(b, BB);
				c = md5_AddUnsigned(c, CC);
				d = md5_AddUnsigned(d, DD);
			}
			if (bit == 32) {
				return (md5_WordToHex(a) + md5_WordToHex(b) + md5_WordToHex(c) + md5_WordToHex(d)).toLowerCase();
			}
			return (md5_WordToHex(b) + md5_WordToHex(c)).toLowerCase();
		},
		// 插件authorization
		Vue.prototype.$_pluginAuthorization = () => {
			let a = JSON.stringify(Vue.prototype.$_FresnsHeader());
			let b = Vue.prototype.$_stringToBase64(a);
			let c = encodeURI(b);
			return c
		},
		// uuid
		Vue.prototype.$_generateUUID = () => {
			return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
				const r = (Math.random() * 16) | 0;
				const v = c === 'x' ? r : (r & 0x3) | 0x8;
				return v.toString(16);
			});
		}
	}
};